const express = require("express");
const { Op, QueryTypes } = require("sequelize");
const dayjs = require("dayjs");

const router = express.Router();

const { DailyMenu, DailyMenuDish, sequelize } = require("../models");
const { NotFoundError, success, failure } = require("../utils/response");

/**
 * 获取今日菜单
 * 根据日期，默认为当天
 */
router.post("/get", async (req, res) => {
  try {
    let date = req.body.date;
    //  校验并格式化日期，防止 sql 注入
    if (dayjs(date, "YYYY-MM-DD", true).isValid()) {
      date = dayjs(date).format("YYYY-MM-DD");
    } else {
      // 日期错误或不存在则使用今天日期
      date = dayjs().format("YYYY-MM-DD");
    }

    const queryDailyDishSql =
      "SELECT id, menuTypeId FROM DailyMenus WHERE `date` = '" + date + "'";

    // 查询今日菜品
    const queryDishesOfTodaySql =
      `SELECT
    D.id,
    D.dishTypeId,
    D.name,
    ` +
      "DT.`name` AS 'dishType'," +
      `
    D.description,
    D.imageUrl,
    D.score,
    D.scoreCount
FROM
    DailyMenus DM
JOIN
    DailyMenuDishes DMD ON DM.id = DMD.dailyMenuId
JOIN
    Dishes D ON DMD.dishId = D.id
JOIN 
    DishTypes DT ON DT.id = D.dishTypeId
WHERE ` +
      "DM.`date` = " +
      `'${date}'`;

    // 根据参数 date 查询 今日菜单，获得 id，menuTypeId，
    const [dailyMenu] = await sequelize.query(queryDailyDishSql, {
      type: QueryTypes.SELECT,
    });
    console.log("🚀 ~ router.post ~ dailyMenu:", dailyMenu);

    console.log(11);

    // 如果没有记录，则创建记录，返回 空
    if (!dailyMenu) {
      const newDailyMenu = await DailyMenu.create({
        menuTypeId: 1,
        date,
      });
      console.log(22);
      return success(res, "", {
        id: newDailyMenu.id,
        menuTypeId: newDailyMenu.menuTypeId,
        dishes: [],
      });
    }

    console.log(33);

    // 查询今日菜品，返回
    const dishes = await sequelize.query(queryDishesOfTodaySql, {
      type: QueryTypes.SELECT,
    });
    success(res, "", { ...dailyMenu, dishes });
  } catch (error) {
    failure(res, error);
  }
});

/**
 * 创建今日菜单
 *
 */
router.post("/creat", async (req, res) => {
  try {
    let { date, menuTypeId, dishIds } = req.body;

    //  校验并格式化日期，防止 sql 注入
    const validDate = dayjs(date, "YYYY-MM-DD", true).isValid();

    if (!validDate || menuTypeId < 1 || dishIds?.length < 1) {
      return success(res, "参数错误");
    }

    //  格式化日期
    date = dayjs(date).format("YYYY-MM-DD");

    // 1. 根据 "date" 查询 DailyMenu 表，是否有记录，没有则创建记录，获取 id
    const queryDailyDishSql =
      "SELECT id, menuTypeId FROM DailyMenus WHERE `date` = '" + date + "'";

    // 根据参数 date 查询 今日菜单，获得 id，menuTypeId，
    let [dailyMenu] = await sequelize.query(queryDailyDishSql, {
      type: QueryTypes.SELECT,
    });

    // 如果没有记录，则创建记录，返回 空
    if (!dailyMenu) {
      dailyMenu = await DailyMenu.create({
        menuTypeId: 1,
        date,
      });
    }

    // 2. 遍历 dishIds 数组，根据 dishId、dailyMenuId，插入 DailyMenuDishes 表记录
    const createDailyMenuDishs = [];
    dishIds.forEach((dishId) => {
      createDailyMenuDishs.push(
        DailyMenuDish.create({ dishId, dailyMenuId: dailyMenu.id })
      );
    });
    await Promise.all(createDailyMenuDishs);

    return success(res, "创建成功");
  } catch (error) {
    res.status(500).json({
      status: false,
      message: "服务器错误",
      errors: [error.message],
    });
  }
});

/**
 * 修改今日菜单
 */
router.post("/update", async (req, res) => {
  try {
    let { id, date, menuTypeId, dishIds } = req.body;

    //  校验并格式化日期，防止 sql 注入
    const validDate = dayjs(date, "YYYY-MM-DD", true).isValid();

    if (id < 1 || !validDate || menuTypeId < 1 || dishIds?.length < 1) {
      return success(res, "参数错误");
    }

    // return res.json({ menuTypeId: menuTypeId || 1 });
    //  格式化日期
    date = dayjs(date).format("YYYY-MM-DD");

    // 1. 根据 id 查询 DailyMenu 表，是否有记录，没有则创建记录，获取 id

    let dailyMenu = await DailyMenu.findByPk(id);

    // 如果没有记录，则创建记录，返回 空
    if (!dailyMenu) {
      dailyMenu = await DailyMenu.create({
        menuTypeId: menuTypeId || 1,
      });
    }
    // return res.json({ dailyMenu });

    // console.log("dailyMenu.update", date, menuTypeId || 1);
    dailyMenu.update({
      menuTypeId: menuTypeId || 1,
    });

    // 3. 根据 dishId dailyMenuId 删除所有 DailyEmnuDish中的关联记录
    await DailyMenuDish.destroy({
      where: {
        dailyMenuId: {
          [Op.eq]: dailyMenu.id,
        },
      },
    });

    // 3. 遍历 dishIds 数组，根据 dishId、dailyMenuId，插入 DailyMenuDishes 表记录
    const dishes = [];
    dishIds.forEach((dishId) => {
      dishes.push(DailyMenuDish.create({ dishId, dailyMenuId: dailyMenu.id }));
    });
    await Promise.all(dishes);

    return success(res, "创建成功");
  } catch (error) {
    res.status(500).json({
      status: false,
      message: "服务器错误",
      errors: [error.message],
    });
  }
});

module.exports = router;
